#!/usr/bin/env bash
set -e
cd $(dirname $0)/..

PROTOB=common/protob

# Bootloader messages cannot end up in core
CORE_PROTOBUF_SOURCES=$(ls $PROTOB/*.proto | grep -v "bootloader")

# Taking all files for python
PYTHON_PROTOBUF_SOURCES=$PROTOB/*.proto

RETURN=0

do_rebuild() {
    local FILE_OR_DIR="$1"
    shift
    local OUTPUT="$1"
    shift
    local SOURCES="$1"
    shift

    if [ "$FILE_OR_DIR" == file ]; then
        local param="--outfile"
    else
        local param="--python-outdir"
    fi

    # LD_LIBRARY_PATH workaround: https://discourse.nixos.org/t/nixpkgs-nixos-unstable-many-package-fail-with-glibc-2-38-not-found/35078 https://github.com/NixOS/nixpkgs/issues/287764
    unset LD_LIBRARY_PATH
    # note $SOURCES is unquoted - we want wildcard expansion and multiple args
    $PROTOB/pb2py "$@" $param="$OUTPUT" $SOURCES
}

do_check() {
    # rebuild protobuf in tmpdir and check result against specified directory
    local TMPDIR=$(mktemp -d proto-check.XXXXXX)
    trap "rm -r $TMPDIR" RETURN

    local FILE_OR_DIR="$1"
    shift
    local OUTPUT="$1"
    shift

    if [ "$FILE_OR_DIR" == file ]; then
        local TMPDEST="$TMPDIR/testfile"
    else
        cp -rT "$OUTPUT" "$TMPDIR"
        local TMPDEST="$TMPDIR"
    fi

    do_rebuild "$FILE_OR_DIR" "$TMPDEST" "$@"
    if ! diff -ur --exclude __pycache__ "$OUTPUT" "$TMPDEST"; then
        RETURN=1
    fi
}

if [ "$1" == "--check" ]; then
    func=do_check
else
    func=do_rebuild
fi

$func dir core/src/trezor/enums "$CORE_PROTOBUF_SOURCES"
$func file core/src/trezor/enums/__init__.py "$CORE_PROTOBUF_SOURCES" --template=core/src/trezor/enums/_proto_init.mako
$func file core/src/trezor/messages.py "$CORE_PROTOBUF_SOURCES" --template=core/src/trezor/_proto_messages.mako

$func file python/src/trezorlib/messages.py "$PYTHON_PROTOBUF_SOURCES" \
    --template=python/src/trezorlib/_proto_messages.mako \
    --include-deprecated

exit $RETURN
